package mc.web;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import mc.bus.IBazaLekarzy;
import mc.bus.IBazaPacjentow;
import mc.bus.IBazaUslug;
import mc.bus.IKsiegaGlowna;
import mc.domain.Lekarz;
import mc.domain.Pacjent;
import mc.domain.SposobPlatnosci;
import mc.domain.Swiadczenie;
import mc.domain.Usluga_na_swiadczeniu;
import mc.web.propertyeditors.LekarzEditor;
import mc.web.propertyeditors.PacjentEditor;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;


public class SwiadczenieFormController extends SimpleFormController {

	private final Logger logger = Logger.getLogger(SwiadczenieFormController.class);	
	private IBazaPacjentow bazapacjentow;
	private IBazaLekarzy bazalekarzy;
	private IBazaUslug bazauslug;
	private LekarzEditor lekarzeditor;
	private PacjentEditor pacjenteditor;
	private IKsiegaGlowna ksiegaglowna;
	private ResourceBundleMessageSource messagesource;
	
	@Override
	protected Map<String, Object> referenceData(HttpServletRequest httpServletRequest) throws Exception {
	       Map<String, Object> refdata = new HashMap<String, Object>();
	       
	       //TODO jakies dao do sposobowPlatnosci
	       SposobPlatnosci karta = new SposobPlatnosci(1,"Karta");
	       SposobPlatnosci gotowka = new SposobPlatnosci(2,"Gotówka");
	       SposobPlatnosci przelew = new SposobPlatnosci(3,"Przelew");
	       List<SposobPlatnosci> l = new ArrayList<SposobPlatnosci>(); l.add(przelew);
	       l.add(karta); l.add(gotowka);
	       
	       refdata.put("sposoby_platnosci", l);
	       return refdata;
	}

	@Override
	protected Object formBackingObject(HttpServletRequest request) throws Exception {

		Swiadczenie s=new Swiadczenie();
		s.setData(new Date());
		int id=-1;
		
		try{
			id=(Integer.parseInt((request.getParameter("id")).toString()));
			//jesli w adresie podany byl id - pacjent zaciagniety z bazy
			if((id>0)&&(request.getParameter("submit")==null))
				s=ksiegaglowna.getSwiadczenieById(id);
				
		}
		
		catch(Exception e){
			logger.error("Nie podano prawidlowego id swiadczenia");
			logger.error(e);
		}
		
		return s!=null ? s : new Swiadczenie();
	}



	@Override
	protected void initBinder(HttpServletRequest arg0, ServletRequestDataBinder binder) throws Exception {
		
		
		DecimalFormat decimalFormat = new DecimalFormat();
		//ustawiam separator dziesietny
		DecimalFormatSymbols symbols = new DecimalFormatSymbols();
		symbols.setDecimalSeparator(','); 
		
		SimpleDateFormat dateFormat = new SimpleDateFormat(messagesource.getMessage("data.format", null, null));
	    dateFormat.setLenient(false);
	    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
		
		decimalFormat.setDecimalFormatSymbols(symbols);
		decimalFormat.setGroupingUsed(false);
		//ustawiam ilosc cyfr w czesci ulamkowej	
		decimalFormat.setMaximumFractionDigits(2);
		decimalFormat.setMinimumFractionDigits(2);
		binder.registerCustomEditor(Double.class,new CustomNumberEditor(Double.class, decimalFormat, true));
		
		binder.registerCustomEditor(Lekarz.class,  lekarzeditor);
		binder.registerCustomEditor(Pacjent.class,  pacjenteditor);
		binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
		//binder.registerCustomEditor(Set.class,"uslugi_na_swiadczeniu", uslugaeditor);
		
	}


	@Override
	protected ModelAndView onSubmit(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception {
		
		logger.info("wchodze do onsubmit");
		
		String dodajusluge=null;
		String zapisz=null;
		
		dodajusluge=arg0.getParameter("iduslugi");
		zapisz=arg0.getParameter("zapisz");
		
		
		Map model=arg3.getModel();
		Swiadczenie s=(Swiadczenie)model.get("swiadczenie");
	
		
		
		if(!StringUtils.isBlank(dodajusluge)){
			
			logger.info("dodanieuslugi");
			try{
				s.addUsluga(new Usluga_na_swiadczeniu(bazauslug.getUslugaById(new Integer(dodajusluge)),1));
			}
			catch(Exception e){
				logger.info(e);
			}
			
			return showForm(arg0, arg1, arg3, model);
			
		}
		
		else if(!StringUtils.isBlank(zapisz)){
			

			
			logger.info("wywolano metode doSubmitAction");
			
			ksiegaglowna.saveSwiadczenie(s);
			
			
			ModelAndView mv=new ModelAndView(getSuccessView());
			return mv;
		}
		
		else{
			String usunusluge=null;
			String el=new String();
			
			Enumeration e=arg0.getParameterNames();
		
			while(e.hasMoreElements()){
				el=e.nextElement().toString();
				
				if(el.startsWith("del,")){
					usunusluge=el.substring(4);
					break;
				}
			}
			
			if(!StringUtils.isBlank(usunusluge)){
			
				logger.info("wywolano przycisk usuń adres");
				try{
					s.delUsluga(new Integer(usunusluge));
				}
				catch(Exception e2){
					logger.info(e2);
				}
				
				
				return showForm(arg0, arg1, arg3, model);
				
			
			}
			
			else{
				logger.info("Nieprawidlowe zadanie");
				return showForm(arg0, arg1, arg3, model);
			}
			
			
		}
		
		
	}

	
	public IBazaPacjentow getBazapacjentow() {
		return bazapacjentow;
	}

	public void setBazapacjentow(IBazaPacjentow bazapacjentow) {
		this.bazapacjentow = bazapacjentow;
	}

	public IBazaLekarzy getBazalekarzy() {
		return bazalekarzy;
	}

	public void setBazalekarzy(IBazaLekarzy bazalekarzy) {
		this.bazalekarzy = bazalekarzy;
	}


	public IBazaUslug getBazauslug() {
		return bazauslug;
	}


	public void setBazauslug(IBazaUslug bazauslug) {
		this.bazauslug = bazauslug;
	}


	public LekarzEditor getLekarzeditor() {
		return lekarzeditor;
	}


	public void setLekarzeditor(LekarzEditor lekarzeditor) {
		this.lekarzeditor = lekarzeditor;
	}


	public PacjentEditor getPacjenteditor() {
		return pacjenteditor;
	}


	public void setPacjenteditor(PacjentEditor pacjenteditor) {
		this.pacjenteditor = pacjenteditor;
	}

	public IKsiegaGlowna getKsiegaglowna() {
		return ksiegaglowna;
	}


	public void setKsiegaglowna(IKsiegaGlowna ksiegaglowna) {
		this.ksiegaglowna = ksiegaglowna;
	}

	
	public ResourceBundleMessageSource getMessagesource() {
		return messagesource;
	}



	public void setMessagesource(ResourceBundleMessageSource messagesource) {
		this.messagesource = messagesource;
	}


	
	
	
}
